const fs = require("fs");
const path = require("path");
const cron = require("node-cron");
const config = require("@/config/index");
const { genrateFunction } = require("@/utils/genrate_nextId");
const initializeDatabase = require("@/db/initSql/initializeDb");
const { repool } = require("@/db");

// 初始化文件根目录
if (!fs.existsSync(config.fileStorageDir)) {
  fs.mkdirSync(config.fileStorageDir, {
    recursive: true,
  });
}

// 初始化生成 id 实例，保存在内存中供全局使用一个实例方法
genrateFunction();

// 初始化数据库
// initializeDatabase()

// 监听数据库连接状态
repool();

// 清理超过 30 分钟未活跃的临时目录
function cleanInactiveTempDirs() {
  if (!fs.existsSync(config.fileStorageDir)) {
    return;
  }

  const spaceDirs = fs.readdirSync(config.fileStorageDir, { withFileTypes: true })
    .filter(dirent => dirent.isDirectory())
    .map(dirent => path.join(config.fileStorageDir, dirent.name));

  spaceDirs.forEach(spaceDir => {
    const tempDirs = fs.readdirSync(spaceDir, { withFileTypes: true })
      .filter(dirent => dirent.isDirectory())
      .map(dirent => path.join(spaceDir, dirent.name));

    tempDirs.forEach(tempDir => {
      const dirName = path.basename(tempDir);
      const parts = dirName.split('_');
      if (parts.length === 2) {
        const timestamp = parseInt(parts[1], 10);
        if (!isNaN(timestamp)) {
          const thirtyMinutesAgo = Math.floor(Date.now() / 1000) - 30 * 60;
          if (timestamp < thirtyMinutesAgo) {
            try {
              fs.rmSync(tempDir, { recursive: true, force: true });
              console.log(`已清理长时间未活跃的临时目录: ${tempDir}`);
            } catch (error) {
              console.error(`清理临时目录 ${tempDir} 时出错:`, error);
            }
          }
        }
      }
    });
  });
}

// 设置定时任务，每 30 分钟执行一次
cron.schedule('*/30 * * * *', () => {
  console.log('开始清理长时间未活跃的临时目录...', new Date());
  cleanInactiveTempDirs();
});

// 清理文件内容的函数
// 清理超过一个月的日志函数
function cleanOldLogs() {
  // 读取文件内容
  fs.readFile(config.logFilePath, "utf8", (err, data) => {
    if (err) {
      console.error("读取文件时出错:", err);
      return;
    }

    const now = new Date();
    const oneMonthAgo = new Date(now.setDate(now.getDate() - 7));

    // 解析日志条目并筛选
    const lines = data.split("\n").filter((line) => line.trim() !== "");
    const recentLogs = lines
      .map(JSON.parse)
      .filter((log) => {
        // 检查日志时间是否在一个星期内
        const logDate = new Date(log.timestamp);
        return !isNaN(logDate) && logDate >= oneMonthAgo;
      })
      .map((log) => JSON.stringify(log));

    // 将筛选后的日志重新写入文件
    const newData = recentLogs.join("\n") + (recentLogs.length > 0 ? "\n" : "");
    console.log(newData.length);
    fs.writeFile(config.logFilePath, newData, "utf8", (err) => {
      if (err) throw err;
      console.log("旧日志已清理，仅保留最近一个月的日志");
    });
  }).catch((err) => {
    console.error("处理日志时出错:", err);
  });
}

// 设置定时任务，例如每周末 10:30 执行
cron.schedule("0 30 10 * * 0", () => {
  console.log("开始清理旧日志...", new Date());
  cleanOldLogs();
});
